####################################################################################
########                        PyConfigUtils                                #######
########                       Scopel Emanuele                               #######
########                      escopel@alice.it                               #######
########                       license GPL3                                  #######
####################################################################################

import sys, os

class PyConfigUtils():

#inizializza la classe ConfigUtils
    def __init__(self, location, filename):
        self.configFile = os.path.join(location,filename)
        self.configDir = location
        self.configOption = {}
        
#Aggiorna il file di configurazione
    def WriteConfig(self):
        """
        WriteConfig si occupa di scrivere il nuovo file di configurazione sul disco
        """
        if os.path.exists(self.configFile):
            newFile = []
            try:
                fd = open(self.configFile, 'r+')
                file = fd.readlines()
                for line in file:
                    if line[0] == '#' or line[0] == '\n' :
                        newFile.append(line)
                    else:
                        for key in self.configOption.keys():
                            ln = line.split('=')
                            opt = ln[0].strip()
                            if opt == key:
                                newFile.append(key + ' = ' + self.configOption[key] + '\n')
                fd.seek(0)
                fd.writelines(newFile)
                fd.close()
            except IOError:
                print 'Impossibile scrivere il file di configurazione'
        else:
            print 'il file ', self.configFile, ' non esite'
            

#Legge il file di configurazione 
    def ReadConfig(self):
        """
        ReadConfig Legge dal disco il file di configurazione e salvando i dati in un dizionario
        """
        lines =''
        if os.path.exists(self.configFile):
            #print 'Leggo il config file: ', self.configFile 
            try:
                fd = open(self.configFile, 'r')
                dat = fd.readlines()
                self.configOption = self.ProcessaConfigFile(dat)
                fd.close()
            except IOError:
                print  'Impossibile leggere il file di configurazione: ', self.configFile
        else:
            print 'il file ', self.configFile, ' non esite'

#Restituisce il valore di una variabile
    def getOptionValue(self, Option, Type='string'):
        """
        getOptionValue restituisce il valore della chiave passata come argomento nel formato indicato in Type.
        i formati supportati sono:
        int -> retsituisce un intero in formato decimale
        hex -> retsituisce un intero in formato esadecimale
        string -> retsituisce una stringa
        """
        value = None
        if self.configOption.has_key(Option):
            if Type == 'string':
                value = str(self.configOption[Option])
            elif Type == 'int':
                value = int(self.configOption[Option])
            elif Type == 'hex':
                value = int(self.configOption[Option],16)
        else:
            print ' la chiave richiesta non esite'
        return value

#setta una variabile convertendo il suo valore in stringa
    def setOptionValue(self, Option, Value):
        """
        setOptionValue imposta un valore a una chiave controllandone l'esistenza e convertendolo in strringa
        """
        
        if self.configOption.has_key(Option):
            self.configOption[Option] = str(Value)
        else:
            print ' la chiave richiesta non esite'
    
    def getAll(self):
        return self.configOption
        
#estrae i valori delle variabili dal file di configurazione
    def ProcessaConfigFile(self, lines):
        """
        Funzione interna usata per processare il file di configurazione
        """
        configOption = {}
        OptionLines = [] 
        for line in lines:
            if line[0] != '#' and  line [0] != '\n' :
                OptionLines.append(line)
        for optln in OptionLines:
            if optln.count('=')  == 1 :
                line = optln.split('=')
                opt = line[0].strip()
                if len(line[1]) == 1:
                    val = None
                else:
                    val = line[1].strip()
                configOption[opt] = val
            else:
                print 'Il file di configurazione contiene un errore.'
                return None
        return configOption
